<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<script>
  /*原料*/
  /*加工*/
  /*出产 : works*/
  // function Factory(career) {
  //   function User(career, work) {
  //     this.career = this.career;
  //     this.works = work;
  //   }
  //
  //   let work;
  //   switch (career) {
  //     case 'coder':
  //       work = ['写代码', '修bug', '摸鱼', '写bug'];
  //       return new User('coder', work);
  //     case 'hr':
  //       work = ['招聘', '员工信息管理', '摸鱼', '定期组织活动'];
  //       return new User('hr', work);
  //     case 'driver':
  //       work = ['开车', '车祸', '翻车', '漂移', '去幼儿园', '高速'];
  //       return new User('driver', work);
  //     case 'boss':
  //       work = ['喝茶', '抽烟', '审批', '规划'];
  //       return new User('boss', work);
  //   }
  // }
  //
  // let coder = new Factory('coder'); //    ['写代码','修bug','摸鱼','写bug']
  // console.log(coder.works);
  // let hr = new Factory('hr'); //          ['招聘','员工信息管理','摸鱼','定期组织活动']
  // console.log(hr.works);
  // let driver = new Factory('driver'); //  ['开车','车祸','翻车','漂移','去幼儿园','高速']
  // console.log(driver.works);
  // let boss = new Factory('boss'); //      ['喝茶','抽烟','审批','规划']
  // console.log(boss.works);

  /*工厂方法模式 : 方法*/
  function Factory(career) {
    // null undefined window 实例
    console.log(this);
    return new this[career]();
  }

  Factory.prototype = {
    'coder': function () {
      this.work = ['写代码', '修bug', '摸鱼', '写bug'];
    },
    'hr': function () {
      this.work = ['招聘', '员工信息管理', '摸鱼', '定期组织活动'];
    }
  };


  let res = new Factory('hr');
  console.log(res.work);

  // let a = {}; a[str] = 1233; 字符串/数字
  /*抽象方法模式*/
  let CareerAbstractFactory = function (subType, superType) {
    // 判断抽象工厂中是否有该抽象类
    if (typeof CareerAbstractFactory[superType] === 'function') {
      // 缓存类
      // function F() { }
      // 继承父类属性和方法
      // 子类原型继承父类
      subType.prototype = new CareerAbstractFactory[superType]();
      // 将子类的constructor指向父类
      subType.constructor = subType;
    } else {
      throw new Error('抽象类不存在')
    }
  };

  let abstractFns = {
    'animal': function () {
      this.works = ['吃小动物'];

    },
    'coder': function () {
      this.roles = ['程序员'];
      this.execute = function () {
        // 功能
        console.log('任务完成');
      };
    },
    'hr': function () {

    },
  };
  for (let key in abstractFns) {
    CareerAbstractFactory[key] = abstractFns[key];
  }


  function Dog() {


  }

  function Person() {


  }

  //CareerAbstractFactory : 创建工厂
  CareerAbstractFactory(Dog, 'animal');
  CareerAbstractFactory(Person, 'coder');
  let dog = new Dog();
  console.log(dog.works);

  let person = new Person();
  console.log(person.roles);
  person.execute();


  // 工厂模式 : 原料 出口
  // 工厂方法模式 :
  // 抽象工厂模式 : 生产工厂的


  /* 抽象工厂*/
  class Animal {

  }

  /*工厂*/
  // class Dog extends Animal {
  //
  // }
  //
  // new Dog();



</script>
</body>
</html>
